如果每次部署的時候都要手動打包然後上傳到Lambda,實在不是一個聰明的方法,因此我們使用Github Action做為我們CI/CD的工具,如果是Github的一般用戶,一個月有2000分鐘的免費執行時間,其實也是足夠了。另外透過Github Action我們也能自動進行測試和檢核,之後串接codecov跟sonarcube來生成測試覆蓋率報告和做程式碼質量檢查。
首先為了能自動化操作AWS,所以我們要先拿到AWS的授權金鑰。登入AWS後,按右上角找到安全憑證
點擊建立存取金鑰,要記好[存取金鑰]&[私密存取金鑰],不然之後只能重新生成
接著我們要把上一步拿到的兩個金鑰讓Github Action能調用,所以我們把專案放上github後,要將兩把金鑰存進專案內,首先到專案頁面→設定→secerts→action→[New repo secret],把上一步的[存取金鑰]&[私密存取金鑰]存進去AWS_ACCESS_KEY_ID跟AWS_SECRET_ACCESS_KEY
這樣就存好摟~
由於Github Action的行為都是透過yml定義的,我們先在專案下新增.github\workflows\aws-lambda.yml
像下面這樣:
記得沒有.github\workflows這個路徑,要自己新增~
接著透過以下aws-lambda.yml的註解來了解Github Action的yml該如何撰寫,可以按照自己的需求調整這份yml就好了~
aws-lambda.yml
name: Build and test Go & Deploy to Lambda # 工作流程的名稱
on:   # 定義觸發工作流程的事件
  workflow_dispatch:  # 允許手動觸發工作流程
  push:   # 當push到github時觸發工作流程
    branches:   # 指定只有分支為"master"和"feature-*"會觸發
      - "master"
      - "feature-*"
  pull_request:   # 當有新的PR開起、同步或重開時會觸發工作流程
    types: [opened, synchronize, reopened]
    branches:   # 指定了觸發分支為"master"
      - "master"
jobs:   # 定義工作流程中的不同的jobs
  Go-Test:  # jobs名稱 (用於測試)
    runs-on: ubuntu-latest  # 指定運行這個job的運行環境
    steps:  # 定義了一系列步驟,每個步驟執行一個特定的操作
      - name: Get project resource # 下載你的repo
        uses: actions/checkout@v3
        with:
          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis
      - name: Setup Go  # 設置Go環境
        uses: actions/setup-go@v4
        with:
          go-version: '1.21' # 指定使用Go版本為1.21
      - name: Run golangci-lint # 運行golangci-lint工具來進行Go代碼的靜態檢查
        uses: golangci/golangci-lint-action@v3
        # golangci-lint didn't merge below PR yet
        with: 
          version: v1.53
          args: --timeout 3m --verbose
        #   output-file: golangci-lint.out
  Deploy-to-Lambda: # 第二個工作,用於部署Go應用程序到AWS Lambda
    runs-on: ubuntu-latest
    needs: [Go-Test] # 依賴於Go-Test,只有在Go-Test這個job跑成功時才會執行(測試過後)
    if: ${{ github.ref == 'refs/heads/master'}} # 指定只有當GitHub分支為"master"時才運行這個job
    steps:
      - name: Configure AWS credentials # 設置AWS的身份驗證信息
        uses: aws-actions/configure-aws-credentials@v1-node16
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1
      # 前面與Go-Test相同
      - name: Get project resource
        uses: actions/checkout@v3
      - name: Setup Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.21' 
      # 跟昨天手動部署的流程相同
      - name: Build Lambda bootstrap
        run: |
          GOOS=linux GOARCH=amd64 go build -o bootstrap main.go
          zip bootstrap.zip bootstrap
          aws lambda update-function-code --function-name BaoSaveLineBot --zip-file fileb://bootstrap.zip
這樣只要當master有異動就會自動deploy到lambda上了,明天再來把codecov跟sonarcube加上去~